/*
 * despacho.cpp
 *
 */

#include <sstream>
#include "clienteCommon.h"
#include "../middleware/CommunicationRobot16.h"
#include "../middleware/CommunicationDespacho.h"
#include "../logger/logger.h"

int main(int argv, char **agrv)
{
	CLogger::create("Despacho");
	CLogger::setLevel(LogLevelEnum::TRACE);

	CLogger::log("Despacho started", LogLevelEnum::INFO);

	std::string hostName = "despacho_pc";

	middleware::CommunicationDespacho communicationDespacho(hostName);
	middleware::CommunicationRobot16 communicationRobot16(hostName);

	while(true)
	{
		middleware::CommunicationDespacho::DespachoRequestType reqType;
		ProductoCantidad productoCantidad;
		OrdenCompraHeader ordenCompra;

		communicationDespacho.getDespachoRequest(reqType,ordenCompra,productoCantidad);

		switch(reqType)
		{
		case middleware::CommunicationDespacho::NOTIFICAR_DESPACHO:
		{
			std::stringstream ss;

			ss << "Se recibio request de notificar pedido completo al cliente:"<< ordenCompra.clientId;
			CLogger::log(ss.str(), LogLevelEnum::TRACE);

			communicationDespacho.notificarCliente(ordenCompra,productoCantidad);

			break;
		}
		case middleware::CommunicationDespacho::RETIRAR:
		{
			std::stringstream ss;

			ss<< "Request de retirar producto de tipo:"
			  << productoCantidad.tipo << " y orden compra:"<<ordenCompra.ordenCompraId
			  << " y cliente:" <<ordenCompra.clientId;

			CLogger::log(ss.str(), LogLevelEnum::TRACE);

			Producto producto;

			//Llamar robot 16
			communicationRobot16.obtenerProductoParaDespacho(ordenCompra,
														     productoCantidad.tipo,
														     producto);

			communicationDespacho.entregarProducto(ordenCompra,
												   producto);
			break;
		}

		default:
			CLogger::log("Se recibio request de tipo desconocido", LogLevelEnum::ERROR);
			break;
		}
	}

	return 0;
}
